package com.example.mq.server.core;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Objects;
import java.util.UUID;

/*
* 表示一个要传递的消息
* 需要在网络上进行传输并且写进文件,需要序列化对象
*
* */
@Data
@Component
public class Message implements Serializable {
    // 核心部分
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;

    // 辅助部分
    // Message 后续会存储到文件中(如果持久化的话)
    // 一个文件中会存储很多消息,如果找到一个文件中的某个消息呢?
    // 使用下面的两个偏移量来表示[offsetBeg,offsetEnd)
    // transient 不会被序列化
    private transient long offsetBeg = 0; // 消息数据的开头离文件头的位置
    private transient long offsetEnd = 0; // 消息数据的结尾离文件头的位置
    // 使用这个属性来表示该消息在文件中是否是有效消息(逻辑删除)
    // 0x1 表示有效,0x0 表示无效
    private byte isValid = 0x1;

    // 创建一个工厂方法, 让其封装一下创建message的过程
    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        // 前缀 为了便于区分不同的uuid
        message.setMessageId("M-"+UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.setBody(body);
        return message;
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    public void setMessageId(String messageId) {
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int deliverMode) {
        basicProperties.setDeliverMode(deliverMode);
    }
}
